using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using 凌依.工具库;

[System.Serializable]
public class 地图数据保存 : 单例_基础管理器<地图数据保存>
{
    public List<地图物品> 地图数据 = new List<地图物品>();

    public List<模板位置> 模板数据 = new List<模板位置>();

    public List<植物> 植物数据 = new List<植物>();

    Dictionary<string, 模板位置> 模板缓存 = new Dictionary<string, 模板位置>();

    /// <summary>
    /// 警告,这将会清空地图所有数据
    /// </summary>
    public void 清除地图数据()
    {
        地图数据管理器.获取实例.上层 = new Dictionary<Vector2Int, 地图物品>();
        地图数据管理器.获取实例.中层 = new Dictionary<Vector2Int, 地图物品>();
        地图数据管理器.获取实例.底层 = new Dictionary<Vector2Int, 地图物品>();
        地图数据管理器.获取实例.顶层 = new Dictionary<Vector2Int, 地图物品>();
        实例化植物控制器.获取实例.后台 = new Dictionary<Vector2Int, 植物>();
    }

    public string 保存数据()
    {
        //对 地图数据管理器 进行操作

        void 解析一层(Dictionary<Vector2Int, 地图物品> 数据)
        {
            foreach (var item in 数据)
            {
                if (item.Value.不可更改)
                {
                    if (模板缓存.ContainsKey(item.Value.名称))
                        模板缓存[item.Value.名称].坐标.Add(item.Key);
                    else
                        模板缓存.Add(item.Value.名称, new 模板位置(item.Value.名称, item.Key,"地面"));
                }
                else
                    地图数据.Add(item.Value);
            }
        }
        解析一层(地图数据管理器.获取实例.底层);
        解析一层(地图数据管理器.获取实例.中层);
        解析一层(地图数据管理器.获取实例.上层);
        解析一层(地图数据管理器.获取实例.顶层);

        foreach (var item in 实例化植物控制器.获取实例.后台)//添加植物信息
        {
            if (item.Value.不可更改)
            {
                if (模板缓存.ContainsKey(item.Value.名称))
                    模板缓存[item.Value.名称].坐标.Add(item.Key);
                else
                    模板缓存.Add(item.Value.名称, new 模板位置(item.Value.名称, item.Key,"地表"));
            }
            else
                植物数据.Add(item.Value);
        }


        foreach (var item in 模板缓存)
            模板数据.Add(item.Value);

        return JsonUtility.ToJson(this);
    }

    public void 加载数据(string json)
    {
        地图数据保存 读取 = JsonUtility.FromJson<地图数据保存>(json);

        地图数据管理器.获取实例.上层 = new Dictionary<Vector2Int, 地图物品>();
        地图数据管理器.获取实例.中层 = new Dictionary<Vector2Int, 地图物品>();
        地图数据管理器.获取实例.底层 = new Dictionary<Vector2Int, 地图物品>();
        地图数据管理器.获取实例.顶层 = new Dictionary<Vector2Int, 地图物品>();
        实例化植物控制器.获取实例.后台 = new Dictionary<Vector2Int, 植物>();

        foreach (var item in 读取.模板数据)
        {
            switch (item.类型)
            {
                case "地面":
                    foreach (var tilePos in item.坐标)
                        地图数据管理器.获取实例.添加瓦片_模板(tilePos, item.模板名);
                    break;
                case "地表":
                    foreach (var tilePos in item.坐标)
                        实例化植物控制器.获取实例.设置数据(item.模板名, tilePos);
                    break;
                default:
                    break;
            }
            
        }
            

        foreach (var item in 读取.地图数据)
            地图数据管理器.获取实例.更改瓦片(item.所在位置, item);

        foreach (var item in 读取.植物数据)
        {
            实例化植物控制器.获取实例.后台.Add(item.所在位置, item);
        }

        Debug.Log("地图信息数据加载完成");
    }
}


[System.Serializable]
public class 模板位置
{
    public string 模板名;
    public string 类型;
    public List<Vector2Int> 坐标 = new List<Vector2Int>();

    public static bool operator ==(模板位置 a, 模板位置 b)
    {
        return a.模板名 == b.模板名;
    }

    public static bool operator !=(模板位置 a, 模板位置 b)
    {
        return !(a.模板名 == b.模板名);
    }

    public 模板位置(string 模板名, Vector2Int pos,string 类型)
    {
        this.模板名 = 模板名;
        this.类型 = 类型;
        坐标.Add(pos);
    }

    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}
